/*
 * Copyright 2017 the original author or authors.
 *
 */

package com.ivo.util;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;

/**
 * <h1>字符串工具</h1>
 * <p>
 * 扩充自 Apache Commons Lang3
 * </p>
 * <b>Note:</b>
 *
 * @author nexf
 * @since 2015/10/2 13:46
 */
public class StringUtil extends StringUtils {

  /**
   * 判断字符是不是汉字字符
   *
   * @param c 待判断字符
   * @return 是/否
   */
  public static boolean isChinese(char c) {
    int v = (int) c;
    return (v >= 19968 && v <= 171941);
  }

  /**
   * 判断是否包含汉字
   *
   * @param str 待判断字符串
   * @return 是/否
   */
  public static boolean containsChinese(String str) {
    if (isNotBlank(str)) {
      for (int i = 0; i < str.length(); i++) {
        if (isChinese(str.charAt(i))) {
          return true;
        }
      }
    }
    return false;
  }

  /**
   * 把字符串按照指定长度进行分割
   *
   * @param string 待分割字符串
   * @param size 长度
   * @return 分割后的字符串数组
   */
  public static String[] split(String string, int size) {
    if (size < 2) {
      throw new IllegalArgumentException("最小长度为两个字节");
    }
    byte[] bytes = string.getBytes();
    if (bytes.length <= size) {
      return new String[]{string};
    }
    // 分成的条数不确定(整除的情况下也许会多出一条),所以先用list再转化为array
    List<String> list = new ArrayList<>();
    int offset = 0;// 偏移量,也就是截取的字符串的首字节的位置
    int length = 0;// 截取的字符串的长度,可能是size,可能是size-1
    int position = 0;// 可能的截取点,根据具体情况判断是不是在此截取
    while (position < bytes.length) {
      position = offset + size;
      if (position > bytes.length) {
        // 最后一条
        String s = new String(bytes, offset, bytes.length - offset);
        list.add(s);
        break;
      }
      if (bytes[position - 1] > 0 || (bytes[position - 1] < 0 && bytes[position - 2] < 0))
      // 截断点是字母,或者是汉字
      {
        length = size;
      } else
      // 截断点在汉字中间
      {
        length = size - 1;
      }
      String s = new String(bytes, offset, length);
      list.add(s);
      offset += length;
    }
    String[] array = new String[list.size()];
    for (int i = 0; i < array.length; i++) {
      array[i] = list.get(i);
    }
    return array;
  }
}
